home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / x11 / video / xevil-1.000 / xevil-1 / coord.h < prev    next >
C/C++ Source or Header  |  1995-07-10  |  6KB  |  289 lines

  1. // "coord.h"  Coordinates and directions and the like.
  2. // TAG: CO
  3.  
  4. /*    Copyright (C) 1994  Steve Hardt
  5.  
  6.     This program is free software; you can redistribute it and/or modify
  7.     it under the terms of the GNU General Public License as published by
  8.     the Free Software Foundation; either version 1, or (at your option)
  9.     any later version.
  10.  
  11.     This program is distributed in the hope that it will be useful,
  12.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.     GNU General Public License for more details.
  15.  
  16.     You should have received a copy of the GNU General Public License
  17.     along with this program; if not, write to the Free Software
  18.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  
  20.     Steve Hardt 
  21.     hardts@athena.mit.edu hardts@media.mit.edu
  22.     hardts@r4002.3dem.bioch.bcm.tmc.edu
  23.     2043 McClendon
  24.     Houston, TX 77030
  25. */
  26.  
  27. #ifndef COORD_H
  28. #define COORD_H
  29.  
  30. #ifndef NO_PRAGMAS
  31. #pragma interface
  32. #endif
  33.  
  34.  
  35. // Include Files
  36. #include "utils.h"
  37.  
  38.  
  39.  
  40. // Defines
  41. #define WSQUARE_WIDTH 16
  42. #define WSQUARE_HEIGHT 16
  43. #define WSQUARE_WIDTH_INV (1.0 / WSQUARE_WIDTH)
  44. #define WSQUARE_HEIGHT_INV (1.0 / WSQUARE_HEIGHT)
  45.  
  46.  
  47. // Order of directions IS guaranteed.
  48. #define CO_center_R 0
  49. #define CO_center_L 1
  50. #define CO_air_R 2
  51. #define CO_air_L 3
  52. #define CO_air 4
  53. #define CO_center 5
  54.  
  55. #define CO_r 6
  56. #define CO_r_DN 7 
  57. #define CO_r_UP 8
  58. #define CO_dn 9
  59. #define CO_dn_R 10
  60. #define CO_dn_L 11
  61. #define CO_l 12
  62. #define CO_l_DN 13
  63. #define CO_l_UP 14
  64. #define CO_up 15
  65. #define CO_up_R 16
  66. #define CO_up_L 17
  67.  
  68. #define CO_climb 18
  69. #define CO_climb_DN 19
  70. #define CO_climb_UP 20
  71. #define CO_air_UP 21
  72. #define CO_air_DN 22
  73. #define CO_climb_R 23
  74. #define CO_climb_L 24
  75.  
  76. #define CO_R 25
  77. #define CO_DN_R_R 26
  78. #define CO_DN_R 27
  79. #define CO_DN_DN_R 28
  80. #define CO_DN 29
  81. #define CO_DN_DN_L 30
  82. #define CO_DN_L 31
  83. #define CO_DN_L_L 32
  84. #define CO_L 33
  85. #define CO_UP_L_L 34
  86. #define CO_UP_L 35
  87. #define CO_UP_UP_L 36
  88. #define CO_UP 37
  89. #define CO_UP_UP_R 38
  90. #define CO_UP_R 39
  91. #define CO_UP_R_R 40
  92.  
  93. #define CO_DIR_MAX 41
  94.  
  95. #define CO_DIR_PURE 16  // "Pure" does not include CO_center.  Use CO_air.
  96.  
  97. typedef int ClassId;
  98. typedef int Dir;
  99. typedef int Touching;
  100. typedef int Stance;
  101. typedef int Corner;
  102. typedef int Mass;
  103. typedef int Health;
  104. typedef int Frame;
  105. typedef int Speed;
  106. typedef long Quanta;
  107.  
  108.  
  109.  
  110. // Data Structures
  111. class Stats {
  112.  public:
  113.   Stats() {creations = uses = deaths = 0; aveLifespan = 0;}
  114.  
  115.   long get_creations() const {return creations;}
  116.   long get_uses() const {return uses;}
  117.   long get_deaths() const {return deaths;}
  118.  
  119.   float get_ave_lifespan() const {return aveLifespan;}
  120.   /* NOTE: Value returned is in seconds. */
  121.  
  122.   void add_creation() {creations++;}
  123.   void add_use() {uses++;}
  124.   void add_death(time_t birthTime);
  125.   
  126.  
  127.  private:
  128.   long creations;
  129.   long uses; // use, explosion.
  130.   long deaths;
  131.   float aveLifespan; // Valid iff deaths > 0.
  132. };
  133.  
  134.  
  135.  
  136. struct Pos {
  137.   Pos() {x = y = 0;}
  138.   Pos(int xx,int yy) {x = xx; y = yy;}
  139.  
  140.   int distance(const Pos &) const;
  141.   /* EFFECTS: Returns distance between two points. */
  142.  
  143.   int distance_2(const Pos&) const;
  144.   /* EFFECTS: Returns square of distance between two points. */
  145.   
  146.   int x; int y;
  147. }; // In pixels
  148.  
  149.  
  150.  
  151. struct Vel {
  152.   Vel() {dx = dy = 0.0;}
  153.   Vel(float x,float y) {dx = x; dy = y;}
  154.   void set_zero() {dx = dy = 0.0;}
  155.   Vel shrink(float k) const;
  156.   void damp(float k);
  157.   Boolean is_zero() const;
  158.   Dir get_dir() const;
  159.   void limit(float k);
  160.   /* REQUIRES: k >= 0 */
  161.   /* EFFECTS: Force dx and dy to be <= k. */
  162.  
  163.   void get_dirs_4(Dir in[4],Dir out[4],int &inNum,int &outNum);
  164.   /* MODIFIES: in, out, inNum, outNum */
  165.   /* EFFECTS: Partitions {CO_R, CO_DN, CO_L, CO_UP} into in and out.  inNum 
  166.      and outNum are set to the sizes of the respective sets. */
  167.  
  168.   float dx; float dy;
  169. };
  170.  
  171.  
  172.  
  173. struct Size {
  174.   Dir get_dir();
  175.   /* EFFECTS: Returns one of {CO_R..CO_UP_R,CO_air}. */
  176.  
  177.   void get_dirs_4(Dir &d1,Dir &d2);
  178.   /* MODIFIES: d1, d2 */
  179.   /* EFFECTS: Gets the two directions of {CO_R,CO_DN,CO_L,CO_UP} that 
  180.      correspond to *this.  If there is only one, it is returned as d1 and 
  181.      d2.  If *this has zero size, d1 == d2 == CO_air on return. */
  182.  
  183.   float cross(const Vel &v);
  184.   /* EFFECTS: z component of the cross product of the size and the Vel. */
  185.  
  186.   void set_zero() {width = height = 0;}
  187.  
  188.   int abs_2() {return width*width + height*height;}
  189.  
  190.   int width; int height; // In pixels.
  191. }; 
  192.  
  193.  
  194.  
  195. // Constructors mess with TouchingList in area.h
  196. struct Loc {
  197.   int r,c; // In WSQUARES.
  198. }; 
  199.  
  200.  
  201.  
  202. struct Dim {
  203.   Dim() {rowMax = colMax = 0;}
  204.   Dim(int rm,int cm) {rowMax = rm; colMax = cm;}
  205.  
  206.   int rowMax, colMax; // In WSQUARES.
  207. }; 
  208.  
  209.  
  210.  
  211. struct Box {
  212.   Box() {};
  213.   Box(const Loc &l,const Dim &d) {loc = l; dim = d;}
  214.   Boolean overlap(const Loc &);
  215.  
  216.   Loc loc; Dim dim; // In WSQUARES.
  217. }; 
  218.  
  219.  
  220.  
  221. struct GLoc {
  222.   int vert, horiz;
  223. };
  224.  
  225.  
  226.  
  227. struct RoomIndex {int down; int across; }; // In rooms.
  228. struct Rooms {
  229.   Rooms() {downMax = acrossMax = 0;}
  230.   Rooms(int dn,int acc) {downMax = dn; acrossMax = acc;}
  231.  
  232.   int downMax, acrossMax;
  233. }; 
  234.  
  235.  
  236.  
  237. struct Acc {
  238.   operator Vel()
  239.     {Vel ret(ddx,ddy); return ret;}
  240.   /* EFFECTS: Converts from an acceleration to velocity.  Assumes initial 
  241.      velocity is 0. */
  242.  
  243.   float ddx, ddy;
  244. };
  245.  
  246.  
  247.  
  248. struct Hanging {
  249.   Hanging() {corner = CO_air;}
  250.  
  251.   Corner corner;
  252.   Loc loc; // Not meaningful if corner == CO_air.
  253. };
  254.  
  255.  
  256.  
  257. typedef int Grav;
  258.  
  259. enum Attack {attackNone, attackStuck, attackFree};
  260.  
  261.  
  262.  
  263. // Function Prototypes
  264. Boolean operator == (const Loc &l1, const Loc &l2);
  265. Boolean operator == (const Pos &p1, const Pos &p2);
  266. Boolean operator == (const Vel &, const Vel &);
  267. Boolean operator == (const Size &s1, const Size &s2);
  268. Boolean operator == (const GLoc &,const GLoc &);
  269. Boolean operator != (const GLoc &,const GLoc &);
  270. Pos operator + (const Pos &pos,const Size &size);
  271. Pos operator - (const Pos &pos,const Size &size);
  272. Size operator - (const Pos &p1,const Pos &p2);
  273. Pos operator + (const Pos &pos, const Vel &vel);
  274. Size operator * (float k,const Size &size);
  275. Vel operator + (const Vel &,const Vel &);
  276. Vel operator + (const Vel &, const Acc &acc);
  277. Vel operator * (float k,const Vel &vel);
  278. Vel operator / (float k,const Vel &vel);
  279. Vel operator + (float k,const Vel &vel);
  280. Acc operator * (int k,const Acc &acc);
  281.  
  282.  
  283. class Coord
  284. {
  285. public:
  286.   static Dir dir_opposite(Dir dir);
  287. };
  288. #endif
  289.